package classfile

import "encoding/binary"

/*
此类看作[]byte类型的一个包装，用来把class文件的数据读取到此类中
*/
type ClassReader struct {
	data []byte
}

func (self *ClassReader) readUint8() uint8 {
	val := self.data[0]
	self.data = self.data[1:] //此时的data数据已经只剩下未读取过的数据了，是go语言的reslice语法
	return val
}

func (self *ClassReader) readUint16() uint16 {
	val := binary.BigEndian.Uint16(self.data)
	self.data = self.data[2:]
	return val
}

//解析class数据的magic number时会用到
func (self *ClassReader) readUint32() uint32 {
	val := binary.BigEndian.Uint32(self.data)
	self.data = self.data[4:]
	return val
}

//jvm规范中并没有定义u8类型
func (self *ClassReader) readUint64() uint64 {
	val := binary.BigEndian.Uint64(self.data)
	self.data = self.data[8:]
	return val
}

/*
读取表数据，而且是uint16表
表头是一个u2类型（16位）的整数，表示表项数据的个数
*/
func (self *ClassReader) readUint16s() []uint16 {
	n := self.readUint16()
	s := make([]uint16, n) //构建一个长度为n的uint16类型的数组
	for i := range s {
		s[i] = self.readUint16()
	}

	return s
}

/*
读取指定长度的字节数据，没有处理bigendian的问题，纯粹只是读取
*/
func (self *ClassReader) readBytes(n uint32) []byte {
	bytes := self.data[:n]
	self.data = self.data[n:]
	return bytes
}
